AWS WAF Bot Controlルールグループを利用してBot対策を試みてみた
ボットによるアクセスが原因と推測されるRDSのDB負荷上昇が確認された環境で、
AWS WAF と AWS WAF Bot Control ルールグループ(AWSManagedRulesBotControlRuleSet)を利用して調査と対策を試みる機会がありました。
その内容について紹介させていただきます。
背景
- RDS、DB のCPU使用率が100%に到達。サービスの遅延やエラー応答が確認されました。
- 暫定対策として RDSのスペックアップを実施、サービス影響を回避していました。
対象システムの状況
RDS パフォーマンスインサイト情報
- 増強によりサービスの遅延は解消しましたが、DB負荷は高い状態が継続していました。
- スペックアップを継続した場合、費用負担も課題でした
AWS WAF による対策
Bot Controlルールグループ追加
既存の WAF ACL に 、AWS WAF Bot Control ルールグループ (AWSManagedRulesBotControlRuleSet)を追加しました。
Bot Control ルール は「Common」を選択
初期段階では、Override rule group action を利用して、すべての「Count」として扱う設定としました。
結果の確認
DB負荷の変動を観察しながら、DB負荷が収束、再上昇が記録されたタイミングで、AWS WAFのレポートを確認しました。
Traffic overview
Bot detection
全アクセスの約2.6%がボットと判定されました。
「Non-bots」をグラフの表示対象から除外、「Verified」「Unverified」の判別、特異な傾向は認められませんでした。
Bot category
「HttpLibrary」を除外して、カテゴリ別のグラフを確認しました。
「SocialMedia」が、DB負荷(AAS)と相関関係にある可能性が判明しました。
Browse bot activity
詳細な分析により、Facebookからのリクエストが特定されました。
ブロック実施
Category単位
今回は副作用、Facebook 以外の SNSへの影響を避けるため、「CategorySocialMedia」単位のブロックは見送りましたが、「CategorySocialMedia」と判定されたリクエスト、一律ブロックは以下で実現出来ます。
- Override rule group action の解除
- Override all rule actions を 「Override to Count」に設定
- 「CategorySocialMedia」のみ 「Override to Block」に設定
Label
AWSManagedRulesBotControlRuleSetが付与したラベルを利用する事で、Facebookと判定されたボットのみのブロックが実現可能です。
WAF、レギュラールール
- Inspect: 「Has a label」
- Match key: 「awswaf:managed:aws:bot-control:bot:name:facebook」「awswaf:managed:aws:bot-control:bot:name:facebook_bot」
こちらも副作用、負荷問題が発生していないページのシェアなどに影響する可能性があったため、
一律のラベル制限も避けました。
UserAgent、リクエストパス
CloudFrontの標準アクセスログをAthena確認を試み、具体的なUserAgent、リクエスト先のパスの確認を試みました。
SELECT sum(time_taken) as sum_time_taken,
count(1) as count_req,
substr(cs_uri_stem, 1, 4) as url_path_4,
cs_user_agent
FROM "cloudfront_standard_logs"
WHERE cs_user_agent not like 'Mozilla%'
group by cs_user_agent,
substr(cs_uri_stem, 1, 4)
order by sum(time_taken) desc
一般的なブラウザ「Mozilla」を名乗るリクエストは除外、
- UserAgent文字列
- リクエストパス(開始数文字)
単位でレスポンス時間(time_taken)の合計値と、リクエスト数を求めました。
特定のパス、Facebook の クローラー(
facebookexternalhit/1.1%20(+http://www.facebook.com/externalhit_uatext.php))に一致するリクエストをブロックするルールを作成しました。
- CloudFormation定義抜粋
- Name: !Sub '${AWS::StackName}-BlockFacebookCrawler'
Priority: 200
Action:
Block: {}
Statement:
AndStatement:
Statements:
- ByteMatchStatement:
SearchString: '/xyz/*'
FieldToMatch:
UriPath: {}
TextTransformations:
- Priority: 0
Type: NONE
PositionalConstraint: STARTS_WITH
- ByteMatchStatement:
SearchString: 'facebookexternalhit'
FieldToMatch:
SingleHeader:
Name: 'user-agent'
TextTransformations:
- Priority: 0
Type: NONE
PositionalConstraint: STARTS_WITH
結果
AWS WAFによるブロック開始後、RDSのDB負荷が大幅に軽減されました。
まとめ
AWS WAF Bot Control ルールを利用した Bot対策により、RDSの負荷軽減に成功した一例を紹介させて頂きました。
ただし、今回ブロックしたFacebookのクローラーは本来は善良な目的のボットでした。
FacebookExternalHit
FacebookExternalHitの主な目的は、Facebook、Instagram、MessengerなどのMetaファミリーのいずれかのアプリで共有されたアプリやウェブサイトのコンテンツをクロールすることです。リンクはコピー&ペースト、またはFacebookソーシャルプラグインを使用して共有されている可能性があります。このクローラーは、アプリまたはウェブサイトに関する情報(タイトル、説明、サムネイル画像など)を収集し、キャッシュに保存し、表示します。
FacebookExternalHitクローラーは、マルウェアや悪意のあるコンテンツのチェックなど、セキュリティまたは整合性のチェックを実行
長期的には、以下の恒久対策を検討しています:
- リクエスト先のページの最適化 (DB、CDN、アプリケーションの見直し、ボトルネック改善)
- robots.txtの見直し (クロール不要なページの除外)
AWS WAFによるブロック、これらの恒久対策が実施されるまでの暫定措置として期間限定での利用予定です。
AWS WAFは、想定外のリクエストに対する迅速な緩和措置として非常に有効です。特にボット対策の必要性が高い場合、AWS WAF Bot Controlルールも併せてお試しください。